package javachongkao.集合.ListIntegerStack;

import java.util.*;
//7-1 jmu-Java-05集合-01-ListIntegerStack
//定义IntegerStack接口，该接口描述了一个存放Integer的栈的常见方法：
//
//public Integer push(Integer item); // 如item为null，则不入栈直接返回null。否则直接入栈，然后返回item。
//public Integer pop(); // 出栈，如栈为空，则返回null。
//public Integer peek(); // 获得栈顶元素，如栈顶为空，则返回null。注意：不要出栈
//public boolean empty(); // 如果栈为空返回true
//public int size();  // 返回栈中元素数量
//定义IntegerStack的实现类ArrayListIntegerStack，内部使用ArrayList存储。该类中包含：
//
//构造方法：
//在无参构造方法中新建ArrayList或者LinkedList，作为栈的内部存储。
//思考：查询JDK文档，尝试说明本题到底使用哪个List实现类最好。
//
//方法:
//public String toString()       //用于输出List中的内容,可直接调用List的toString()方法。可用System.out.println(list)进行输出。
//
//提示：
//
//不建议使用top指针。最好直接复用List实现类中已有的方法。
//pop时应将相应的元素从列表中移除。
//main方法说明
//建立ArrayListIntegerStack对象
//输入m个值，均入栈。每次入栈均打印入栈返回结果。
//输出： 栈顶元素，输出是否为空，然后输出size.
//输出栈中所有元素（调用其toString()方法）
//输入x，然后出栈x次，每次均打印出栈的对象。
//输出:栈顶元素，输出是否为空，输出size。注意：这里的输出栈顶元素，仅输出、不出栈。
//输出栈中所有元素（调用其toString()方法）。注意：返回null，也要输出。
//思考：
//如果使用LinkedList来实现IntegerStack，怎么实现？测试代码需要进行什么修改？

// IntegerStack接口
interface IntegerStack {
    Integer push(Integer item);
    Integer pop();
    Integer peek();
    boolean empty();
    int size();
}

// ArrayList实现的IntegerStack
class ArrayListIntegerStack implements IntegerStack {
    private ArrayList<Integer> list;

    public ArrayListIntegerStack() {
        list = new ArrayList<>();
    }

    @Override
    public Integer push(Integer item) {
        if (item == null) return null;
        list.add(item);
        return item;
    }

    @Override
    public Integer pop() {
        if (list.isEmpty()) return null;
        return list.remove(list.size() - 1);
    }

    @Override
    public Integer peek() {
        if (list.isEmpty()) return null;
        return list.get(list.size() - 1);
    }

    @Override
    public boolean empty() {
        return list.isEmpty();
    }

    @Override
    public int size() {
        return list.size();
    }

    @Override
    public String toString() {
        return list.toString();
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        ArrayListIntegerStack stack = new ArrayListIntegerStack();

        // 输入m个值并入栈
        int m = scanner.nextInt();
        for (int i = 0; i < m; i++) {
            Integer num = scanner.nextInt();
            System.out.println(stack.push(num));
        }

        // 输出栈顶元素、是否为空、size
        System.out.println(stack.peek() + "," + stack.empty() + "," + stack.size());

        // 输出栈中所有元素
        System.out.println(stack);

        // 输入x并出栈x次
        int x = scanner.nextInt();
        for (int i = 0; i < x; i++) {
            System.out.println(stack.pop());
        }

        // 再次输出栈顶元素、是否为空、size
        System.out.println(stack.peek() + "," + stack.empty() + "," + stack.size());

        // 再次输出栈中所有元素
        System.out.println(stack);
    }
}
